// 在线用户对象
class OnlineUser {
	constructor(body) {
		// 保存用户的id(主键)
		this._id = body._id;
		// 保存其他信息
		// 上线时间
		this.onlineTime = new Date();
		// 当前状态(重连，在线)
		this.state = 0;
		this.sokcet = null;
	}
	// 绑定socket对象和用户的方法
	setSocket(sokcet) {
		this.sokcet = sokcet;
		// 将用户重置为在线
		this.state = 1;
	}
}


// 数据库查询结果对象
class DataRls {
	// 定义那些属于受保护的字段
	// static protect = ["password", "groups", "friendId", "emailId"];
	static protect = ["password"];


	constructor(describe, data, result, error = null) {
		// 描述信息
		this.describe = describe;
		// 查询到的数据
		this.data = data;
		// 查询的结果(布尔值)
		this.result = result;
		// 错误信息(如果有的话)
		this.error = error;
	}

	// 这个函数获取不重要信息的描述信息的方法
	// 这个函数会剔除出名单中不能传递给前端的值，将不重要的数据收集变成一个新的对象
	getMessage() {
		let obj = {}
		obj.describe = this.describe;
		obj.result = this.result;
		obj.data = {};
		// 使用三元表达式获取一定存在的值
		let savaData = this.data ? (this.data._doc ? this.data._doc : this.data) : {};

		// 去除受保护的部分
		// 这里的作用不是要进行深拷贝，所以没有必要使用递归
		for (let key in savaData) {
			// 当前对象不是受保护的值
			if (DataRls.protect.indexOf(key) == -1) {
				obj.data[key] = savaData[key];
			}
		}
		return obj;
	}
}

// 发送的消息数据类型
class Message {
	constructor(sendBody) {
		this.room = sendBody.room;
		this.sendID = sendBody.sendID;
		this.receiveID = sendBody.receiveID;
		this.message = sendBody.message;
		this.sendType = sendBody.sendType;
		this.time = new Date();
	}

	// 获取时间方法    
	getTime() {
		return this.time.toLocaleDateString('en-GB') + "\t" + this.time.toLocaleTimeString('it-IT');
	}

	// 转换为email对象的方法
	// 参数为true表示是需要回执的类型，参数为false表示是不需要回执的类型
	toEmailObject(flag = false) {
		const emailObject = {
			sendID: this.sendID,
			receiveID: this.receiveID,
			message: this.message,
			room: this.room,
			sendType: this.sendType,
			time: this.time,
			// 加入email类型特有属性
			notes: flag, //是否需要回执执行
			read: false, //是否已读
			result: flag ? "wait" : "close",
		};
		return emailObject;
	}
}

// 邮件类型
class Email extends Message {
	constructor(sendBody, flag = false) {
		super(sendBody);
		this.notes = sendBody.notes || ""; //是否需要回执执行
		this.result = flag ? "wait" : "close";
		if (sendBody.meta) {
			this.meta = sendBody.meta; 
		} else {
			this.meta = {}; 
		}
	}
}


module.exports = {
	DataRls,
	OnlineUser,
	Message,
	Email
}